W801 您所在的位置:网站首页 汇编 ld W801

W801

2023-03-29 21:33| 来源: 网络整理| 查看: 265

相关参考:打酱油的工程师:W801|芯片规格书|寄存器手册|总线|时钟|主频|学习(5-1):W801-SDK启动分析之芯片规格书及寄存器手册阅读笔记前言

W801 默认程序是从内部FLASH 中开始运行的。

(具体执行流程及.ELF文件可参考:[FLASH算法|.elf文件|基本类型- FLASH算法文件介绍](FLASH算法|.elf文件|基本类型- FLASH算法文件介绍))

SDK所采用的编译工具链为csky-elfabiv2。链接文件是:gcc_csky.ld。

关键字ENTRY所指向的入口是Reset_Handler,即启动时先进行复位操作,之后进入启动程序,执行startup.S。

startup.S文件分析

startup.S 是SDK的启动文件,位于:G:\bsp\W800_aos\W80X_SDK_v1.00.10\platform\arch\xt804\bsp\startup.S smartl的启动文件应与GCC一起用于CSKY嵌入式处理器,SDK启动时,先运行sys目录下的startup.S。

中断定义引入相关头文件:#include .section .vectors内部中断定义/*内部中断 */ .long SDIO_IRQHandler /* 0: SDIO */ .long MAC_IRQHandler /* 1: MAC */ .long RF_Cfg_IRQHandler /* 2: RF Cfg */ .long SEC_IRQHandler /* 3: SEC */ .long DMA_Channel0_IRQHandler /* 4: DMA_Channel0 */ .long DMA_Channel1_IRQHandler /* 5: DMA_Channel1 */ .long DMA_Channel2_IRQHandler /* 6: DMA_Channel2 */ .long DMA_Channel3_IRQHandler /* 7: DMA_Channel3 */ .long DMA_Channel4_7_IRQHandler /* 8: DMA_Channel4_7 */ .long DMA_BRUST_IRQHandler /* 9: DMA_BRUST */ .long I2C_IRQHandler /* 10: IIC */ .long ADC_IRQHandler /* 11: SD ADC */ .long SPI_LS_IRQHandler /* 12: LS SPI */ .long SPI_HS_IRQHandler /* 13: HS SPI */ .long GPIOA_IRQHandler /* 14: GPIOA */ .long GPIOB_IRQHandler /* 15: GPIOB */ .long USART_IRQHandler /* 16: UART0 */ .long USART1_IRQHandler /* 17: UART1 */ .long USART2_IRQHandler /* 18: UART2&7816 */ .long USART3_5_IRQHandler /* 19: USART3_5 */ .long BLE_IRQHandler /* 20: BLE */ .long BT_IRQHandler /* 21: BT */ .long PWM_IRQHandler /* 22: PWM */ .long I2S_IRQHandler /* 23: I2S */ .long SDIO_HOST_IRQHandler /* 24: SDIO HOST */ .long CORET_IRQHandler /* 25: CoreTIM */ .long RSA_IRQHandler /* 26: RSA */ .long GPSEC_IRQHandler /* 27: GPSEC */ .long FLASH_IRQHandler /* 28: Flash */ .long PMU_IRQHandler /* 29: PMU */ .long TIM0_5_IRQHandler /* 30: Timer0_5 */ .long WDG_IRQHandler /* 31: Watch dog */

接着运行系统初始化程序:

3个初始化进程

主要执行3个初始化进程:

系统初始化#ifndef __NO_SYSTEM_INIT jbsr SystemInit #endif SystemInit执行G:\bsp\W800_aos\W80X_SDK_v1.00.10\platform\arch\xt804\bsp\system.c 引入必要的头文件: #include #include "csi_core.h" #include "wm_regs.h" #include "wm_cpu.h"定义:

extern int32_t g_top_irqstack;

irq堆栈定义:g_top_irqstack: .section .vdata .align 10 .globl irq_vectors .type irq_vectors, @object irq_vectors: .space CONFIG_IRQ_VECTOR_SIZE .size irq_vectors, . - irq_vectors .globl irq_vectors_end irq_vectors_end:函数csi_coret_get_load

extern uint32_t csi_coret_get_load(void); 函数体: 功能:获取核心计时器重新装载值 返回值:核心计时器值

__STATIC_INLINE uint32_t csi_coret_get_load(void) { return CORET->LOAD; }

函数csi_coret_get_value:

extern uint32_t csi_coret_get_value(void);

函数体: 功能:获取核心计时器计数器值 返回值: 核心计时器计数器值

__STATIC_INLINE uint32_t csi_coret_get_value(void) { return CORET->VAL; }

板级初始化:

主要完成采用UART0或UART1串口波特率及端口设置。

#ifndef __NO_BOARD_INIT jbsr board_init #endif初始化内容:void board_init(void) { #if USE_UART0_PRINT /* use uart0 as log output io */ uart0Init(115200); set_printf_port(0); #else uart1_io_init(); /* use uart1 as log output io */ uart1Init(115200); set_printf_port(1); #endif }uart0Init()函数定义:static void uart0Init (int bandrate) { unsigned int bd; NVIC_DisableIRQ(UART0_IRQn); NVIC_ClearPendingIRQ(UART0_IRQn); bd = (APB_CLK/(16*bandrate) - 1)|(((APB_CLK%(bandrate*16))*16/(bandrate*16))


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有